package com.heima.user.service.impl;


import cn.hutool.core.util.DesensitizedUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.heima.model.article.pojos.ApUserRealname;
import com.heima.model.common.constants.CommonConstants;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.user.dtos.AuthDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.mapper.admin.ApUserRealnameMapper;
import com.heima.user.service.ApUserRealnameService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Slf4j
@Service
public class ApUserAdminRealnameServiceImpl implements ApUserRealnameService {
    // 定义常量
    private static final String DEFAULT_SALT = "abc123"; // 默认盐值
    private static final String DEFAULT_PASSWORD = "123456"; // 默认明文密码

    @Autowired
    private ApUserRealnameMapper apUserRealnameMapper;

    @Autowired
    private ApUserMapper apUserMapper;

    /**
     * 分页查询审核表
     */
    @Override
    public ResponseResult apUserRealnameList(AuthDto dto) {
        log.info("服务端业务层开始处理分页查询");
        // 设置分页参数
        Page<ApUserRealname> page = new Page<>(dto.getPage(), dto.getSize());
        // 构建查询条件
        QueryWrapper<ApUserRealname> queryWrapper = new QueryWrapper<>();
        if (dto.getStatus() != null) {
            queryWrapper.eq("status", dto.getStatus());

            // 分页查询
            Page<ApUserRealname> apUserRealnamePage = apUserRealnameMapper.selectPage(page, queryWrapper);

            // 返回结果设置到date中进行封装
            return ResponseResult.okResult(apUserRealnamePage.getRecords());

        }
        List<ApUserRealname> newApUserRealname = new ArrayList<>();
        // 分页查询
        Page<ApUserRealname> apUserRealnamePage = apUserRealnameMapper.selectPage(page, null);
        List<ApUserRealname> apUserRealnameList = apUserRealnamePage.getRecords();
        for (ApUserRealname apUserRealname : apUserRealnameList) {
            apUserRealname.setIdno(upDetaIdno(apUserRealname.getIdno()));
            newApUserRealname.add(apUserRealname);
        }
        // 返回结果封装
        return ResponseResult.okResult(newApUserRealname);
    }

    //todo :身份证号脱敏
    private String upDetaIdno(String idno) {
        return DesensitizedUtil.idCardNum(idno, 4, 2);
    }


    /**
     * 审核成功  返回参数
     */
    @Override
    public ApUser userRealnameAuthPass(AuthDto dto) {
    log.info("APP端，开通账号自媒体人账号");

                // 查询实名认证记录
                ApUserRealname apUserRealname = apUserRealnameMapper.selectById(dto.getId());

                log.info("更改申请通过状态");
                apUserRealnameMapper.updateById(apUserRealname);

                // 更新到`ap_user`表
                ApUser apUser = new ApUser();
                apUser.setStatus(CommonConstants.STATUS_ACTIVE); // 正常状态
                apUser.setFlag(CommonConstants.FLAG_MEDIA);
                apUser.setName(apUserRealname.getName()); // 标记为自媒体人
                apUser.setCreatedTime(new Date()); // 设置注册时间

                log.info("app端开通自媒体人状态:{}", apUser);

                // 设置盐值
                String salt = "abc123"; // 可以根据需求动态生成
                apUser.setSalt(salt);

                // 明文密码
                String plainPassword = "1111111";

                // 进行 MD5 加密
                String encryptedPassword = DigestUtils.md5Hex(salt + plainPassword);
                apUser.setPassword(encryptedPassword);

                log.info("用户在ap_user表中存在，执行新增");
                apUserMapper.insert(apUser);

                // 获取插入后的用户数据
                ApUser apUser1 = apUserMapper.selectById(apUser.getId());
                log.info("获取到 app 端用户信息返回：{}", apUser1);

                return apUser1;
            }

    @Override
    public ResponseResult userRealnameAuthFail(AuthDto dto) {
        ApUserRealname apUserRealname = apUserRealnameMapper.selectById(dto.getId());
        apUserRealname.setStatus(CommonConstants.STATUS_FAILED);//设置失败
        apUserRealname.setReason(dto.getMsg());

        //更新表
        apUserRealnameMapper.updateById(apUserRealname);
        ApUser apUser = new ApUser();
        BeanUtils.copyProperties(apUserRealname, apUser);
        // 更新用户信息为正常状态且标记为用户
        apUser.setFlag(CommonConstants.FLAG_NORMAL);//普通用具
        apUser.setCreatedTime(new Date());
        apUserMapper.updateById(apUser);
        // 返回失败原因
        return ResponseResult.okResult(apUserRealname.getReason());
    }

}
